package models

import (
	"context"
	"time"
	"wx-uniapp-go/internal/repository/dto"
)

// 商品状态常量
const (
	ProductStatusDraft   = 0 // 草稿
	ProductStatusOnSale  = 1 // 在售
	ProductStatusOffSale = 2 // 下架
	ProductStatusSoldOut = 3 // 售罄
)

// 配送方式常量
const (
	DeliveryTypeHour      = "hour"     // 小时达
	DeliveryTypeNextDay   = "next_day" // 明日达
	DeliveryTypeCrossCity = "cross"    // 跨城达
)

// Product 商品表
type Product struct {
	Id                 string          `json:"id" xorm:"pk autoincr"`
	SupplierId         int64           `json:"supplier_id" xorm:"not null comment('供应商ID') index"`
	Title              string          `json:"title" xorm:"varchar(255) not null comment('商品标题')"`
	Cover              string          `json:"cover" xorm:"varchar(255) not null comment('商品主图')"`
	DetailImages       []string        `json:"detail_images" xorm:"json not null comment('商品详情图片数组')"`
	BannerImages       []string        `json:"banner_images" xorm:"json not null comment('商品宣传图片数组')"`
	Price              int64           `json:"price" xorm:"not null comment('商品价格(分)')"`
	OriginPrice        int64           `json:"origin_price" xorm:"not null default 0 comment('商品原价(分)')"`
	Stock              int             `json:"stock" xorm:"not null default 0 comment('商品库存')"`
	SalesVolume        int             `json:"sales_volume" xorm:"not null default 0 comment('销量')"`
	Tags               []string        `json:"tags" xorm:"json not null comment('商品标签数组')"`
	Models             []string        `json:"models" xorm:"json not null comment('商品模块数组')"`
	Categorys          []string        `json:"categorys" xorm:"not null comment('商品分类数组') index"`
	Unit               string          `json:"unit" xorm:"varchar(20) not null default '' comment('商品单位')"`
	Weight             int             `json:"weight" xorm:"not null default 0 comment('商品重量(克)')"`
	SpecInfo           []*dto.SpecInfo `json:"spec_info" xorm:"json not null comment('规格信息')"`
	SkuList            []*dto.SkuInfo  `json:"sku_list" xorm:"json not null comment('SKU列表')"`
	DeliveryTypes      []string        `json:"delivery_types" xorm:"json not null comment('配送方式')"`
	Description        string          `json:"description" xorm:"text not null default '' comment('商品描述')"`
	Notice             string          `json:"notice" xorm:"varchar(500) not null default '' comment('购买须知')"`
	Status             int             `json:"status" xorm:"tinyint(1) not null default 0 comment('状态：0草稿 1在售 2下架 3售罄')"`
	Sort               int             `json:"sort" xorm:"not null default 0 comment('排序值')"`
	IsRecommend        int             `json:"is_recommend" xorm:"tinyint(1) not null default 0 comment('是否推荐：0否 1是')"`
	IsNew              int             `json:"is_new" xorm:"tinyint(1) not null default 0 comment('是否新品：0否 1是')"`
	IsHot              int             `json:"is_hot" xorm:"tinyint(1) not null default 0 comment('是否热销：0否 1是')"`
	MinBuyNum          int             `json:"min_buy_num" xorm:"not null default 1 comment('最小购买数量')"`
	MaxBuyNum          int             `json:"max_buy_num" xorm:"not null default 0 comment('最大购买数量，0不限制')"`
	DeliveryTemplateId int64           `json:"delivery_template_id" xorm:"not null default 0 comment('运费模板ID')"`
	SalesTime          time.Time       `json:"sales_time" xorm:"not null comment('开售时间')"`
	UpdateTime         time.Time       `json:"update_time" xorm:"not null updated comment('更新时间')"`
	CreateTime         time.Time       `json:"create_time" xorm:"not null created comment('创建时间')"`
}

// TableName 表名
func (Product) TableName() string {
	return "product"
}

func ProductFindByPage(ctx context.Context, keyword, categoryId, tagId, deliveryType string, page, pageSize int) (res []Product, count int64, err error) {

	session := getSession(ctx).Where("status = ?", ProductStatusOnSale)

	// 分类筛选
	if categoryId != "" {
		session = session.Where("categorys LIKE ?", "%"+categoryId+"%")
	}

	// 标签筛选
	if tagId != "" {
		session = session.Where("tags LIKE ?", "%"+tagId+"%")
	}

	// 配送方式筛选
	if deliveryType != "" {
		session = session.Where("delivery_types LIKE ?", "%"+deliveryType+"%")
	}

	// 关键词搜索
	if keyword != "" {
		session = session.Where("title LIKE ?", "%"+keyword+"%")
	}

	count, err = session.Table("product").OrderBy("sales_volume DESC").Limit(pageSize, (page-1)*pageSize).FindAndCount(&res)
	return
}

func ProductFindByTagsPage(ctx context.Context, tagIds []string, deliveryType string, page, pageSize int) (res []Product, count int64, err error) {

	session := getSession(ctx).Where("status = ?", ProductStatusOnSale)

	// 标签筛选
	if len(tagIds) > 0 {
		for _, tagId := range tagIds {
			session = session.Or("tags LIKE ?", "%"+tagId+"%")
		}
	}

	// 配送方式筛选
	if deliveryType != "" {
		session = session.Where("delivery_types LIKE ?", "%"+deliveryType+"%")
	}

	count, err = session.Table("product").OrderBy("sales_volume DESC").
		Limit(pageSize, (page-1)*pageSize).FindAndCount(&res)
	return
}

// ProductFindByIds 根据ID列表查询商品
func ProductFindByIds(ctx context.Context, ids []string) (data []*Product, err error) {
	err = getSession(ctx).In("id", ids).Find(&data)
	return
}
